package co.edu.udea.iw.prestamos.modelo.dao;

import java.util.List;

import co.edu.udea.iw.prestamos.util.exception.DatabaseException;
import co.edu.udea.iw.prestamos.util.exception.RegistryNotFoundException;

/**
 * Interfaz generica que implementa el CRUD para todos los DAO. 
 * 
 * @author Dave Rivera <daverivera90@gmail.com>
 * @since 02-07-2014
 * @version 1.0
 * @param <T> POJO que maneja el DAO.
 */
public interface CrudDAO<T, ID> {
	
	/**
	 * Almacena un objeto tipo <T> en la base de datos.
	 * 
	 * @param  objeto    		 Objeto que se desea almacenar
	 * @return          		 Regresa el objeto almacenado
	 * @throws DatabaseException Devuelta si ocurre algun error almacenando el objeto
	 */
	public T crear(T objeto) throws DatabaseException;
	
	/**
	 * Elimina un objeto tipo <T> de la base de datos
	 * @param  objeto            Objeto que se desea eliminar
	 * @return                   Objeto eliminado
	 * @throws DatabaseException Devuelta si ocurre algun error eliminando el objeto
	 */
	public T eliminar(T objeto) throws DatabaseException;
	
	/**
	 * Actualiza un objeto <T> en la base de datos.
	 * 
	 * @param  objeto            Objeto que se desea actualizar
	 * @return                   Regresa el objeto actualizado
	 * @throws DatabaseException Devuelta si ocurre algun error actualizando el objeto
	 */
	public T actualizar(T objeto) throws DatabaseException;
	
	/**
	 * Obtiene un único objeto <T>. 
	 *
	 * Permite obtener un objeto con el identificador del registro.
	 * @param id Identificador del objeto 
	 * @return   Objeto asociado al identificador ingresado
	 */
	public T obtenerPorId(ID id) throws RegistryNotFoundException;
	
	/**
	 * Obtiene una lista con todos los objetos <T> de la base de datos
	 * @return Lista con todos los objetos <T>
	 */
	public List<T> obtenerTodos();

}
